#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
DESIREDREVISION=""
if [ "$1" != "" ]
then
  DESIREDREVISION="-r $1"
fi
# You should NOT need to modify anything below.
# NB: derby_source must be defined.
# NB NB: Assumes a svn update IS done when run first time!
#        If neccessary do a svn up -rXXXXXX to a previous revision first.
#---------------------------------------------
TOOLDIR="${DERBYDIR}/${BRANCH_DIR}/tools/testing/reporting/scripts"
. ${TOOLDIR}/env

SRCDIR=${derby_source}

if [ ! -e ${SRCDIR} ]
then
    echo "${SRCDIR} does not exist."
    exit
fi
SANDBOX=`basename ${DERBYDIR}`
UPDATELOGDIR=${DERBYDIR}/UpdateLog
UPDATEID=`date +%Y-%m-%d_%H-%M-%S`

UPDATELOGDIRCUR=${UPDATELOGDIR}/${UPDATEID}
mkdir -p ${UPDATELOGDIRCUR}
if [ ! -e ${UPDATELOGDIRCUR} ]
then
    echo "${UPDATELOGDIRCUR} does not exist."
    exit
fi

# First time...
mkdir -p ${DERBYDIR}/testing

SVNHOSTINFO=`uname -srpi`
SVNHOST=`uname -n`
SVNHOST=`host ${SVNHOST} | awk '{print $1}'`
cd ${SRCDIR}

rm -f ${UPDATELOGDIR}/updateOK

svn --version > ${UPDATELOGDIRCUR}/svn--version

LASTUPDATEREVISION=`head -1 ${REVISIONLIST}`
OLDREVISION=`svn info | grep '^Revision:'`
OLDREPOSITORY=`svn info | grep '^URL:'`

echo "${SVNHOSTINFO}[${SVNHOST}]" > ${UPDATELOGDIRCUR}/status-u.out
echo "${OLDREVISION} ${OLDREPOSITORY}" >> ${UPDATELOGDIRCUR}/status-u.out

svn status -u >> ${UPDATELOGDIRCUR}/status-u.out 2> ${UPDATELOGDIRCUR}/status-u.err

echo "${SVNHOSTINFO}[${SVNHOST}]" > ${UPDATELOGDIRCUR}/update.out

STARTTIME=`date +%Y-%m-%d" "%H:%M:%S" "%Z`

####################################
# Do the update
#
svn update ${DESIREDREVISION} >> ${UPDATELOGDIRCUR}/update.out 2> ${UPDATELOGDIRCUR}/update.err
#
####################################

REVISION=`svn info | grep '^Revision:'`
REPOSITORY=`svn info | grep '^URL:'`

REVISION=`echo ${REVISION} | gawk '{ print $2 }'`
OLDREVISION=`echo ${OLDREVISION} | gawk '{ print $2 }'`

echo "${REVISION} ${REPOSITORY}" >> ${UPDATELOGDIRCUR}/update.out
svn status >> ${UPDATELOGDIRCUR}/update.out 2>> ${UPDATELOGDIRCUR}/update.err
cp ${UPDATELOGDIRCUR}/update.out  ${UPDATELOGDIR}/update.out

echo "LASTUPDATEREVISION: ${LASTUPDATEREVISION}, OLDREVISION: ${OLDREVISION}, REVISION: ${REVISION}"

# java/testing/README.htm is NOT readable by 'o' by default....
# I publish a web-link to it:
chmod go+r java/testing/README.htm

# Flag that update went OK:
if [ -e ${UPDATELOGDIR}/${UPDATEID}/update.err ]
then
  LNSERR=`wc -l ${UPDATELOGDIR}/${UPDATEID}/update.err | gawk '{ print $1 }'`
  echo "LNSERR: ${LNSERR}"
  if [ "${LNSERR}" = "0" ]
  then
    ls -l ${UPDATELOGDIR}/${UPDATEID}/update.out
    if [ -e ${UPDATELOGDIR}/${UPDATEID}/update.out ]
    then
      UPDATED=`grep "Updated to revision" ${UPDATELOGDIR}/${UPDATEID}/update.out | wc -l | gawk '{ print $1 }'`
      UNCHANGED=`grep "At revision" ${UPDATELOGDIR}/${UPDATEID}/update.out | wc -l | gawk '{ print $1 }'`
      echo "UPDATED: ${UPDATED}, UNCHANGED: ${UNCHANGED}."
      if [ "${UPDATED}" = "1" -o "${UNCHANGED}" = "1" ]
      then
        echo "LASTUPDATEREVISION: ${LASTUPDATEREVISION}, OLDREVISION: ${OLDREVISION}, REVISION: ${REVISION}"
        if [ "${UNCHANGED}" = "1" ]
        then
          echo "UNCHANGED is 1"
          STATUS="unchanged from revision ${LASTUPDATEREVISION}/${OLDREVISION} to"
          # echo "${TOOLDIR}/textMail \"Derby ${STATUS} ${REVISION}\" \"${MAILTOEXT}\" \"${UPDATELOGDIR}/update.out\""
          # ${TOOLDIR}/textMail "Derby ${STATUS} ${REVISION}" "${MAILTOEXT}" "${UPDATELOGDIR}/update.out"
          # Remove ...../${UPDATEID}/
          rm -rf ${UPDATELOGDIR}/${UPDATEID}
          echo "${STATUS} ${REVISION}"
          exit
        else
          echo "UNCHANGED is not 1"
          STATUS="updated to revision"
          echo ${REVISION} > ${REVISIONLIST}.this
          cp ${REVISIONLIST} ${REVISIONLIST}.prev
          cat ${REVISIONLIST}.this ${REVISIONLIST}.prev > ${REVISIONLIST}
          rm -f ${REVISIONLIST}.prev ${REVISIONLIST}.this
          echo "touch ${UPDATELOGDIR}/updateOK"
          touch ${UPDATELOGDIR}/updateOK

          UPDATEINFO="UpdateInfo"
          mkdir -p ${DERBYDIR}/${UPDATEINFO}
          REVLO="${DERBYDIR}/${UPDATEINFO}/${REVISION}.txt"
          echo "Changes from ${LASTUPDATEREVISION}/${OLDREVISION} to ${REVISION}:" > ${REVLO}
          ${TOOLDIR}/svnLogRevs.new ${OLDREVISION} ${REVISION} >> ${REVLO}
          echo " " >> ${REVLO}
          cat ${UPDATELOGDIR}/${UPDATEID}/update.out >> ${REVLO}

          LUREV="${DERBYDIR}/${UPDATEINFO}/LatestUpdateRevision.txt"
          echo ${REVISION} > ${LUREV}
          SRC="${REVLO} ${LUREV}"
          chmod go+r ${SRC}

          SCPUT=/usr/bin/scp # Do NOT block this one
          DST="${PUBLISHDIR}/${UPDATEINFO}/"
          echo "**** OBS! ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}"
          ### UNCOMMENT TO PUBLISH. ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}
          
          # echo "${TOOLDIR}/textMail \"${SANDBOX} ${STATUS} ${REVISION}\" \"${MAILTOEXT}\" \"${UPDATELOGDIR}/update.out\""
          # ${TOOLDIR}/textMail "Derby ${STATUS} ${REVISION}" "${MAILTOEXT}" "${UPDATELOGDIR}/update.out"
          # Rename ...../${UPDATEID}/ to  ...../${REVISION}/
          mv ${UPDATELOGDIR}/${UPDATEID} ${UPDATELOGDIR}/${REVISION}
          echo ${STARTTIME} > ${UPDATELOGDIR}/${REVISION}/UpdateTime
          echo "Changes from ${LASTUPDATEREVISION}/${OLDREVISION} to ${REVISION}."
          exit
        fi
        echo "updateDerby 1"
      fi
      echo "updateDerby 2"
    fi
    echo "updateDerby 3"
  fi
  echo "updateDerby 4"
fi
echo "updateDerby 5"
### UNCOMMENT TO SEND MAIL. ${TOOLDIR}/textMail "${SANDBOX} update failed" "${MAILTOINT}" "${UPDATELOGDIR}/update.out ${UPDATELOGDIRCUR}/update.err"
### UNCOMMENT TO SEND MAIL.  ${TOOLDIR}/textMail "${SANDBOX} update failed" "${MAILTOEXT}" "${UPDATELOGDIR}/update.out ${UPDATELOGDIRCUR}/update.err"
